/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.restaumanager.dao;

import com.restaumanager.api.IFiltreForm;
import java.util.List;
import javax.persistence.Query;

/**
 *
 * @author CYRIL
 */
public interface IDAO<T, PK extends java.io.Serializable> {
    
    Class<T> getType();
    /**
     * Persiste une instance t de la classe T.
     *
     * @param t
     * @return T
     */
    public T ajouter(T t);

    /**
     * Modifie une instance t.
     *
     * @param t
     * @return T
     */
    public T modifier(T t);

    /**
     * supprime une instance à partir de l'identifiant k.
     *
     * @param k
     * @return boolean
     */
    public boolean supprimer(PK k);

    /**
     * supprime une instance t.
     *
     * @param t
     * @return boolean
     */
    public void supprimer(T t);

    /**
     * Supprime toutes les instances.
     *
     */
    public void supprimer();

    /**
     * Renvoie une instance à partir de l'identifiant k.
     *
     * @param k
     * @return T
     */
    public T selectionner(PK k);

    /**
     * Renvoie une liste des instances.
     *
     * @return List<T>
     */
    public List<T> lister();

    /**
     * Renvoie une liste triée des instances.
     *
     * @param tri Critère ou attribut de tri
     * @param asc Ordre de tri
     * @return List<T>
     */
    public List<T> lister(String tri, boolean asc);

    /**
     * Renvoie le nombre d'enregistrement.
     *
     * @return Long
     */
    public Long nombreEnreg();

    public Long nombreEnreg(IFiltreForm q);

    /**
     * Renvoie une liste triée d'un nombre instances à partir d'un debut.
     *
     * @param debut
     * @param nombre
     * @param tri
     * @param asc
     * @return List<T>
     */
    public List<T> lister(int debut, int nombre, String tri, boolean asc);

//    public List<T> lister(int debut, int nombre, String tri, boolean asc, CriteriaQuery<T> c, Root<T> t);
    public List<T> lister(int debut, int nombre, IFiltreForm q);

    /**
     * Renvoie une liste triée d'un nombre instances à partir d'un debut.
     *
     * @param debut
     * @param nombre
     * @param tri
     * @param asc
     * @return List<T>
     */
//    public List<T> lister(String attribut, String valeur, int debut, int nombre, String tri, boolean asc);
    /**
     * Renvoie l'exécution d'une requête de sélection.
     *
     * @param requete Requête à excécuter
     * @return List<T>
     */
    public List<T> executerRequete(String requete, String sortAttrib, String sortDir);

    public List<T> executerRequete(Query requete);

    List<T> executerRequete(IFiltreForm filtreForm, String sortAttrib, String sortDir);

    /**
     * Renvoie l'exécution d'une requête de mise à jour.
     *
     * @param requete Requête à excécuter
     * @return int
     */
    public int executerModif(String requete);

    public int executerModif(Query requete);

    public Query creerQuery(String requete);
    
    List<T> lister(int debut, int nombre, String tri, boolean asc, IFiltreForm filtre);
}
